; 打印字符串 bx寄存器存放字符串地址
print:
    pusha ; 保存当前寄存器环境

start_print:
    mov al, [bx]
    cmp al, 0
    je end_print
    mov ah, 0x0e
    int 0x10
    add bx, 1
    jmp start_print

end_print:
    popa ; 恢复寄存器环境
    ret


; 打印换行
print_nl:
    pusha

    mov ah, 0x0e
    mov al, 0x0a
    int 0x10
    mov al, 0x0d
    int 0x10

    popa
    ret

; hex打印dx寄存器
print_hex:
    pusha
    mov cx, 0

convert_one_byte:
    cmp cx, 4 ;迭代4次，每次4位，共16位2字节
    je print_hex_end
    mov ax, dx
    and ax, 0x000f ; 保留后4位
    add ax, 0x30 ; 数字转asci码 '0' => 0x30(48)
    cmp ax, 0x39 ; 大于9转a-f
    jle format_hex
    add ax, 7    ; 'A' => 65 若ax大于10其asci码为ax-10+65=ax+48+7 上面已经加过48了 所以加7
format_hex:
    mov bx, HEX_STR + 5 ; 最后一位的地址
    sub bx, cx
    mov [bx], al
    ror dx, 4    ; dx循环右移4位
    add cx, 1
    jmp convert_one_byte

print_hex_end:
    mov bx, HEX_STR
    call print
    popa
    ret

; 数据
HEX_STR:
    db '0x0000', 0